package evensong;

public class APIDay06Evensong {
    public static void main(String[] args) {
        /*
        Aoo o1 = new Aoo();
        o1.a = 5;
        Aoo o2 = o1; //将o1的地址做了个副本后赋值给o2了，是在指向同一个对象
        o2.a = 8;
        System.out.println(o1.a); //8
         */

        int a = 5;
        int b = a; //将a的值做了个副本后赋值给b了
        b = 8;
        System.out.println(a); //5
    }
}

class Aoo{
    int a;
}

/*
简答题、问答题:
1.JDK、JRE、JVM的区别:
  1)JDK:java开发工具包，是java的核心，包括:JRE+编译、运行等命令工具
  2)JRE:java运行环境，是运行java程序所必须的环境集合，包括:JVM+java系统类库
  3)JVM:java虚拟机，是java实现跨平台的最核心部分，能够运行java语言所开发的程序
2.java的8种基本数据类型是什么?(简述java的8种基本数据类型)
  答:8种基本数据类型包括: byte,short,int,long,float,double,boolean,char
    1)byte:字节型，用于存储整数的，占用1个字节，范围-128到127
    2)short:短整型，用于存储整数的，占用2个字节，范围-32768到32767
    3)int:最常用的整型，用于存储整数的，占用4个字节，范围-2^31到2^31-1
    4)long:长整型，用于存储较大的整数，占用8个字节，范围-2^63到2^63-1
    5)float:单精度符点数，用于存储小数的，占用4个字节，不能表示精确的值
    6)double:双精度符点数，最常用的存储小数的类型，占用8个字节，不能表示精确的值
    7)boolean:布尔型，用于存储true或false，占用1个字节
    8)char:字符型，采用Unicode字符编码格式，用于存储单个字符，占用2个字节
3.switch可以作用于哪些数据类型上?
  答:byte,short,int,char,String,枚举，其余类型都不允许
4.重写(override)与重载(overload)的区别:
  1)重写:发生在父子类中，方法名相同，参数列表相同
  2)重载:发生在同一类中，方法名相同，参数列表不同
5.实例变量与静态变量的区别:
  ---实例变量和静态变量都属于成员变量
     1)实例变量:是属于对象的，在创建对象时存储在内存堆中，创建多少个对象，则实例
               变量就会在内存中存在多少份，需要通过引用变量来访问
     2)静态变量:是属于类的，在类被加载时存储在内存方法区中，无论创建多少个对象，
               静态变量在内存中都只有一份，常常通过类名点来访问
6.抽象类和接口的区别:
  1)抽象类:
    1.1)由abstract修饰
    1.2)可以包含变量、常量、构造方法、普通方法、静态方法、抽象方法
    1.3)派生类通过extends继承
    1.4)只能继承一个(单一继承)
    1.5)抽象类中的成员，任何访问权限都可以(默认为默认权限(同包中))
  2)接口:
    2.1)由interface定义
    2.2)可以包含常量、抽象方法、静态方法(1.8后)、默认方法(1.8后)
    2.3)实现类通过implements实现
    2.4)可以实现多个(体现多实现)
    2.5)接口中的成员，访问权限只能是public(默认public权限)
7.String s = new String("hello");创建了几个对象?
  答: 两个。一个是hello字面量对象，另一个是new出来的对象。
8.String常用的方法有哪些?
  1)length():获取字符串的长度(字符个数)
  2)trim():去除两边的空白字符
  3)toUpperCase()/toLowerCase():将英文部分给转换为全大写字母/全小写字母
  4)startsWith()/endsWith():判断是否是以???开始/结束的
  5)charAt():根据下标找字符
  6)indexOf()/lastIndexOf():查找字符串第一次出现/最后一次出现的下标
  7)substring():截取字符串
  8)静态方法valueOf():将其它类型的数据转换为字符串
  9)matches():验证匹配(正则表达式)
  10)replaceAll():替换(正则表达式)
  11)split():拆分(正则表达式)
9.==和equals()的区别:
  1)==可以作用于基本类型，也可以作用于引用类型
    1.1)若为基本类型，则是在比较值是否相等
    1.2)若为引用类型，则是在比较地址值是否相等
  2)equals()只能作用于引用类型
    2.1)Object类的equals()默认比较的还是==(即比较地址)，但是没有参考意义，所以
        常常需要重写equals()来比较对象的属性值是否相同。注意:String类重写了
        equals()来比较字符串的内容是否相同
10.String、StringBuilder、StringBuffer的区别:
   1)String:由final修饰，所以不能被继承。底层封装的是final的字符数组，所以为不变
            对象，每次修改String引用变量的值，都是在创建新的对象。适合查看，但不
            适合频繁修改，在实际应用中对于字符串大部分情况下都是在查看，所以String
            的应用率最高。
   2)StringBuilder:底层封装的是字符数组，所做操作都是在该数组之上的，修改效率高，
                   非线程安全的，并发处理的，性能稍快---一般都用StringBuilder
   3)StringBuffer:底层封装的是字符数组，所做操作都是在该数组之上的，修改效率高，
                   线程安全的，同步处理的，性能稍慢
11.ArrayList和LinkedList的区别:
   1)ArrayList是基于数组实现的，容量不够时采用复制方式扩容，
     而LinkedList使用链表实现的。
   2)ArrayList比LinkedList在访问的时候效率要高，通过物理地址查找，速度快
     而LinkedList是链表结构，需要依次查找元素，性能不高
   3)LinkedList首尾增删效率高，而ArrayList增删性能稍差
   4)综合来说，需要频繁读取集合中的元素时，更推荐使用ArrayList，而在头尾增删
     操作比较多时，更推荐使用LinkedList，ArrayList综合性能优秀，应优选。
12.Collection和Collections的区别:
   1)Collection是一个集合接口，是集合类的一个顶级接口，它里面定义了集合的通用
     方法，List接口和Set接口都直接继承了Collection接口。
   2)Collections是集合的一个工具类，其中提供了一系列静态方法，用于对集合中的
     元素进行排序、反转、搜索以及线程安全等操作。
13.java是值传递还是引用传递?
   答:在java中，无论是基本类型还是引用类型，都是值传递
      1)对于基本类型而言，传递的是具体的值的副本
      2)对于引用类型而言，传递的是具体的地址的副本
 */
